package pl.edu.mimuw.mas.agent.behaviour.hunting.grouping;

import jade.core.AID;
import jade.core.behaviours.OneShotBehaviour;
import jade.lang.acl.ACLMessage;

import java.awt.Color;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import pl.edu.mimuw.mas.agent.HuntingAgent;
import pl.edu.mimuw.mas.util.GroupHelper;

/**
 * Wybieram agenta z najwyższą efektywną charyzmą i informuję go
 * o podłączeniu się do jego grupy.
 *
 */
public class LeaderChooseBehaviour extends OneShotBehaviour {

	private static final long serialVersionUID = 1244731957726567512L;
	
	protected final Logger logger = LoggerFactory.getLogger(getClass());
	
	public LeaderChooseBehaviour(HuntingAgent a) {
		super(a);
	}

	@Override
	public void action() {
		HuntingAgent a = (HuntingAgent) myAgent;

		a.getGroup().clear();

		Double bestEchar =  a.getEffectiveCharisma(a.getPosition());
		AID bestAID = a.getAID();

		Double echar;
		for (AID aid : a.getCharismaCache().keySet()) {
			echar = a.getCharismaCache().get(aid);
			if (echar > bestEchar) {
				bestEchar = echar;
				bestAID = aid;
			}
		}

		logger.debug("{} : moim liderem został {}", a.getName(), bestAID.getName());

		a.setLeader(bestAID);

		if (!a.isLeader()) {
			informLeader(bestAID);
		}

		Color c = GroupHelper.getGroupColor(bestAID);

		a.setColor(c.getBlue(), c.getGreen(), c.getRed());

	}

	/**
	 * Informuje agenta <code>leader</code>, że przyłączam się do jego grupy.
	 * @param leader AID lidera, do którego się przyłączamy
	 */
	private void informLeader(AID leader) {
		HuntingAgent ha = (HuntingAgent) myAgent;

		ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
		msg.setConversationId(HuntingAgent.GROUP_CONV);

		msg.addReceiver(leader);

		ha.send(msg);
	}

}